<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        //【1】概述
        // es6有7种数据格式，前六种是：undefined、null、布尔值（Boolean）、字符串（String）、数值（Number）、对象（Object）。第七种是Symbol
        //【1-1】这是一个新的数据结构
        let s = Symbol();
        console.log(typeof(s)); // "symbol"
        //【1-2】不可使用new，传参仅仅为了打印时候方便观察，实战没啥用。
        let s1 = Symbol('foo');
        let s2 = Symbol('bar');
        s1 // Symbol(foo)
        s2 // Symbol(bar)

        console.log(s1.toString()); // "Symbol(foo)"
        console.log(s2.toString()); // "Symbol(bar)"
        const obj = {
            toString() {
                return 'abc';
            }
        };
        const sym = Symbol(obj);
        console.log(sym); //如果 Symbol 的参数是一个对象，就会调用该对象的toString方法，将其转为字符串，然后才生成一个 Symbol 值。
        //【1-3】每个Symbol实例都是独一无二的
        // 没有参数的情况
        let s11 = Symbol();
        let s22 = Symbol();
        console.log(s11 === s22); // false


        // 有参数的情况
        let s111 = Symbol('foo');
        let s222 = Symbol('foo');
        console.log(s111 === s222); // false
        //【1-4】Symbol 值不能与其他类型的值进行运算，会报错。
        let sym1 = Symbol('My symbol');

        // "your symbol is " + sym1;
        // TypeError: can't convert symbol to string
        // `your symbol is ${sym1}`;
        // TypeError: can't convert symbol to string

        // 但是，Symbol 值可以显式转为字符串。
        let sym2 = Symbol('My symbol');
        console.log(String(sym2)); // 'Symbol(My symbol)'
        console.log(sym2.toString()); // 'Symbol(My symbol)'

        // 另外，Symbol 值也可以转为布尔值，但是不能转为数值。
        let sym3 = Symbol();
        Boolean(sym3); // true

        if (sym3) {
            console.log("ok");
        } else {
            console.log("false")
        }
        // 但是不能转为数值。
        // Number(sym) // TypeError
        // sym + 2 // TypeError
    </script>
</body>

</html>